#include <STC8G1K08.h>
#include<intrins.h>

#define NUM_LEDS 14

//sbit DATA_PIN = P1^3;

//8pin
sbit DATA_PIN = P3^3;
//--------------------------------------------
int light_v1 = 2;
int light_v2 = 5;

typedef struct CRGB{
    int red;
    int green;
    int blue;
};
struct CRGB leds[NUM_LEDS];
//--------------------------------------------

void showBit(int item){
	int i;
	for(i=0;i<8;i++){
		DATA_PIN = 1;
		DATA_PIN=(item&0x80);	
		_nop_();_nop_();_nop_();_nop_();
		item<<=1;
		DATA_PIN = 0;
	}
	DATA_PIN = 0;
}

void show(){
	int i;
	for(i=0;i<NUM_LEDS;i++){
		showBit(leds[i].green);
		showBit(leds[i].red);
		showBit(leds[i].blue);
	}
}


void setOne(int index,int r,int g,int b){
	leds[index].red = r;
	leds[index].green = g;
	leds[index].blue = b;
}

void init(){
		int i;
		P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

		for(i=0;i<NUM_LEDS;i++){
			leds[i].red = 0;
			leds[i].green = 0;
			leds[i].blue = 0;
		}
}

void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 16;
	j = 147;
	do
	{
		while (--j);
	} while (--i);
}

void delay(int ms){
	int i;
	for(i=0;i<ms;i++){
		Delay1ms();
	}
}


void blink(int r,int g,int b,int ms){
	int i;
  for(i=0; i<NUM_LEDS; i++) {
    setOne(i,r,g,b);
  }
	show();
  delay(ms);
}

void revolve(int forward,int ms){
	int i;
	struct CRGB temp;
  if(forward==1){
    temp=leds[NUM_LEDS-1];
    for(i=NUM_LEDS-1; i>0; i--) {
        leds[i]=leds[i-1];
    }
    leds[0]=temp;
  }else{
    temp=leds[0];
    for(i=0; i<NUM_LEDS-1; i++) {
        leds[i]=leds[i+1];
    }
    leds[NUM_LEDS-1]=temp;
  }
  show();
  delay(ms);
}

void status_yellow() { 
	int i;
  for(i=0; i<100; i++) {
   revolve(0,30);
  }
}

void status_red() { 
	int i;
  for(i=0; i<200; i++) {
   revolve(0,10);
  }
}

void main()
{
	  init();
		while(1){
			blink(0,0,light_v1,100);
			blink(0,0,light_v2,150);
			blink(0,0,light_v1,150);
			blink(0,0,light_v2,150);
			blink(light_v1,light_v1,0,200);
			blink(0,0,light_v2,50);
			blink(0,0,light_v2,200);
			blink(light_v2,light_v2,0,100);
			blink(0,0,light_v2,200);
			blink(light_v2,light_v2,0,50);
			
			setOne(0,0,0,0);
			status_yellow();
			
			
			blink(light_v1,light_v1,0,100);
			blink(light_v2,light_v2,0,150);
			blink(light_v1,light_v1,0,150);
			blink(light_v2,light_v2,0,150);
			blink(light_v1,0,0,200);
			blink(light_v2,0,0,50);
			blink(light_v1,0,0,200);
			blink(light_v2,light_v2,0,100);
			blink(light_v1,0,0,200);
			blink(light_v2,0,0,50);
			setOne(0,0,0,0);
			status_red();
		}
} 
   